<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <h2>一、扩展运算符</h2>
  <div>ES6通过扩展元素符...,主要用于函数调用的时候，将一个数组变为参数序列</div>
  <br>
  <div>可以将某些数据结构转为数组</div>
  <br>
  <div>注意：通过扩展运算符实现的是浅拷贝(展开一个新数组等于老数组)，修改了引用指向的值，会同步反映到新数组</div>
  <br>
  <div>扩展运算符可以与解构赋值结合起来，用于生成数组</div>
  <script>
    // 可以将某些数据结构转为数组
    // [...document.querySelectorAll('div')]
    // // 能够更简单实现数组复制
    // const a1 = [1, 2];
    // const [...a2] = a1;
    // // [1,2]
    // // 数组的合并也更为简洁了
    // const arr1 = ['a', 'b'];
    // const arr2 = ['c'];
    // const arr3 = ['d', 'e'];
    // [...arr1, ...arr2, ...arr3]
    // // [ 'a', 'b', 'c', 'd', 'e' ]

    // 扩展运算符可以与解构赋值结合起来，用于生成数组
    // const [first, ...rest] = [1, 2, 3, 4, 5];
    // first // 1
    // rest  // [2, 3, 4, 5]

    // const [first, ...rest] = [];
    // first // undefined
    // rest  // []

    // const [first, ...rest] = ["foo"];
    // first  // "foo"
    // rest   // []

    // 可以将字符串转为真正的数组
    // [...'hello']
    // [ "h", "e", "l", "l", "o" ]
    </script>

    <h2>二、构造函数新增的方法</h2>
    <ul>
      <li>Array.from()</li>
      <li>Array.of()</li>
    </ul>
    <h4>Array.of()</h4>
    <div>将两类对象转为真正的数组：类似数组的对象和可遍历（iterable）的对象（包括 ES6 新增的数据结构 Set 和 Map）</div>
    <br>
    <div>还可以接受第二个参数，用来对每个元素进行处理，将处理后的值放入返回的数组</div>
    <script>
      // Array.from([1, 2, 3], (x) => x * x)
      // [1, 4, 9]

      // 没有参数的时候，返回一个空数组
      // 当参数只有一个的时候，实际上是指定数组的长度
      // 参数个数不少于 2 个时，Array()才会返回由参数组成的新数组
      // Array.of(3, 11, 8) // [3,11,8]
      // Array() // []
      // Array(3) // [, , ,]
      // Array(3, 11, 8) // [3, 11, 8]
    </script>
    <h4>Array.of()</h4>
    <div>用于将一组值，转换为数组</div>

    <h2>三、实例对象新增的方法</h2>
    <div>关于数组实例对象新增的方法有如下：</div>
    <ul>
      <li>copyWithin()</li>
      <li>find()、findIndex()</li>
      <li>fill()</li>
      <li>entries()，keys()，values()</li>
      <li>includes()</li>
      <li>flat()，flatMap()</li>
    </ul>
    <script>
      // copyWithin()
      // 将指定位置的成员复制到其他位置（会覆盖原有成员），然后返回当前数组
      // target（必需）：从该位置开始替换数据。如果为负值，表示倒数。
      // start（可选）：从该位置开始读取数据，默认为 0。如果为负值，表示从末尾开始计算。
      // end（可选）：到该位置前停止读取数据，默认等于数组长度。如果为负值，表示从末尾开始计算。
      // [1, 2, 3, 4, 5].copyWithin(0, 3) // 将从 3 号位直到数组结束的成员（4 和 5），复制到从 0 号位开始的位置，结果覆盖了原来的 1 和 2
      // [4, 5, 3, 4, 5] 

      // find()、findIndex()
      // find()用于找出第一个符合条件的数组成员
      // 参数是一个回调函数，接受三个参数依次为当前的值、当前的位置和原数组
      // [1, 5, 10, 15].find(function(value, index, arr) {
      //   return value > 9;
      // }) // 10

      // findIndex返回第一个符合条件的数组成员的位置，如果所有成员都不符合条件，则返回-1
      // [1, 5, 10, 15].findIndex(function(value, index, arr) {
      //   return value > 9;
      // }) // 2

      // fill()
      // 使用给定值，填充一个数组
      // ['a', 'b', 'c'].fill(7)
      // [7, 7, 7]

      // new Array(3).fill(7)
      // [7, 7, 7]
      // 还可以接受第二个和第三个参数，用于指定填充的起始位置和结束位置
      // ['a', 'b', 'c'].fill(7, 1, 2)
      // ['a', 7, 'c']

      // entries()，keys()，values()
      // keys()是对键名的遍历、values()是对键值的遍历，entries()是对键值对的遍历
      // for (let index of ['a', 'b'].keys()) {
      //   console.log(index);
      // }
      // 0
      // 1

      // for (let elem of ['a', 'b'].values()) {
      //   console.log(elem);
      // }
      // 'a'
      // 'b'

      // for (let [index, elem] of ['a', 'b'].entries()) {
      //   console.log(index, elem);
      // }
      // 0 "a"

      // includes()
      // 用于判断数组是否包含给定的值
      // [1, 2, 3].includes(2)     // true
      // [1, 2, 3].includes(4)     // false
      // [1, 2, NaN].includes(NaN) // true
      // 方法的第二个参数表示搜索的起始位置，默认为0
      // 参数为负数则表示倒数的位置

      // flat()，flatMap()
      // 将数组扁平化处理，返回一个新数组，对原数据没有影响
      // [1, 2, [3, 4]].flat()
      // [1, 2, 3, 4]
      // flat()默认只会“拉平”一层，如果想要“拉平”多层的嵌套数组，可以将flat()方法的参数写成一个整数，表示想要拉平的层数，默认为1
      // [1, 2, [3, [4, 5]]].flat()
      // [1, 2, 3, [4, 5]]

      // [1, 2, [3, [4, 5]]].flat(2)
      // [1, 2, 3, 4, 5]
      // flatMap()方法对原数组的每个成员执行一个函数相当于执行Array.prototype.map()，然后对返回值组成的数组执行flat()方法。该方法返回一个新数组，不改变原数组
    </script>
    <h2>四、数组的空位</h2>
    <div>数组的空位指，数组的某一个位置没有任何值,ES6 则是明确将空位转为undefined。</div>
    <h2>五、排序稳定性</h2>
    <div>将sort()默认设置为稳定的排序算法</div>
</body>
</html>